home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / eulisp / mpfeel.lha / MPFeel / Modules / fut.em < prev    next >
Lisp/Scheme  |  1992-10-06  |  2KB  |  86 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                           ;;
  3. ;;  EuLisp Module                     Copyright (C) University of Bath 1991  ;;
  4. ;;                                                                           ;;
  5. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  6.  
  7. (defmodule fut
  8.  
  9.   (classes
  10.    extras
  11.    lists
  12.    list-operators
  13.    streams
  14.    arith
  15.    others
  16.    ccc) ()
  17.  
  18.   ;; Book-keeping...
  19.  
  20.   (deflocal future-count-value 0)
  21.  
  22.   (defun future-count () future-count-value)
  23.  
  24.   (defun set-future-count (n) (setq future-count-value n))
  25.  
  26.   (defun increment-future-count () 
  27.     (setq future-count-value (+ future-count-value 1)))
  28.  
  29.   (defun zero-future-count () (setq future-count-value 0))
  30.  
  31.   (export future-count set-future-count 
  32.           increment-future-count zero-future-count)
  33.  
  34.   ;; Future structure...
  35.  
  36.   (defstruct future-object ()
  37.     ((function accessor future-object-function)
  38.      (thread accessor future-object-thread)
  39.      (value accessor future-object-value)
  40.      (done  initform nil
  41.             accessor future-object-done))
  42.     constructor make-future-object)
  43.  
  44.   (export future-object future-object-value future-object-function
  45.       future-object-done make-future-object future-object-thread)
  46.  
  47.   (defun futurep (obj) (eq (class-of obj) future-object))
  48.  
  49.   (export futurep)
  50.  
  51.   ;; Future macro...
  52.  
  53.   (defmacro future exp
  54.     `(let 
  55.        ((future (make-future-object))
  56.     (task (lambda (future fun)
  57.         ((setter future-object-value) future (fun))
  58.         ((setter future-object-done) future t)
  59.         t)))
  60.        ((setter future-object-thread) future task)
  61.        ((setter future-object-function) future (lambda () ,@exp))
  62. ;;       (thread-start task future (lambda () ,@exp)) 
  63. ;;       (print "Made future")
  64.        (increment-future-count)
  65.        future))
  66.        
  67.   (export future)
  68.  
  69.   (defun futureeval (fut)
  70.     (if (futurep fut)
  71.     (if (future-object-done fut) (futureeval (future-object-value fut))
  72.       (progn
  73. ;;        (thread-value (future-object-thread fut))
  74.         ((future-object-thread fut) fut (future-object-function fut))
  75.         (futureeval fut)))
  76. ;;      (print fut)
  77.     fut))
  78.     
  79.   (export futureeval)                  
  80.      
  81.   (defun future-done-p (fut) (future-object-done fut))
  82.  
  83.   (export future-done-p)
  84.  
  85. )
  86.